package com.hs.server.thirdPart.hs;

import com.alibaba.fastjson.JSON;
import com.hs.server.domain.ShDetItemConfig;
import com.hs.server.domain.VehQueuexxb;
import com.hs.server.domain.VehZnshinfo;
import com.hs.server.domain.VehZnshzlzpxx;
import com.hs.server.dto.VehPhotodesDto;
import com.hs.server.dto.Vehicle;
import com.hs.server.mapper.XbjcMapper;
import com.hs.server.service.*;
import com.hs.server.thirdPart.IOpenService;
import com.hs.server.thirdPart.hs.params.IQ_18C22;
import com.hs.server.utils.MD5Encryption;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description: 东莞预审核
 * @Author: sujianzhi
 * @Date: 2021/4/19 11:23
 */
@Slf4j
public class HSOpenServiceImpl2 implements IOpenService {
    @Autowired
    private XbjcMapper xbjcMapper;
    @Autowired
    private VehZnshinfoService vehZnshinfoService;
    @Autowired
    private VehZnshzlzpxxService vehZnshzlzpxxService;
    @Autowired
    private ShDetItemConfigService shDetItemConfigService;
    @Autowired
    private VehQueuexxbService vehQueuexxbService;
    @Autowired
    private ShItemConfigService shItemConfigService;

    public String jyjgbh;//检验机构编号

    @PostConstruct
    public void init(){
        this.jyjgbh = xbjcMapper.getJyjgbh();
    }

    @Override
    public List<Vehicle> IQ_18C22_1(IQ_18C22 f, String shlb) {
        //查询待审核流水信息
        return xbjcMapper.getVehicleList(f.getQsrq(),Integer.parseInt(f.getFhzdjls()));
    }

    @Override
    public void IQ_18C22_2(IQ_18C22 iq_18C22) {
        //根据jylsh获取所有照片信息
        try {
            String jylsh = iq_18C22.getLsh();
            //开始时间
            long stime = System.currentTimeMillis();
            VehZnshinfo vehZnshinfo = vehZnshinfoService.GetVehZnshinfoByLsh(jylsh);
            //是第二次获取(可能为资料照片)
            if (vehZnshinfo != null) {
                //重置化字段
                //可能第二次没有或者已经存在的照片没进行审核从而导致shzt、czzt置为初始状态了
                vehZnshinfo.setShzt("0");
                vehZnshinfo.setCzzt("0");//默认值，未检验
                vehZnshinfo.setCjsj(new Date());//前端才可以看到可能第二次资料的结果
                vehZnshinfo.setGxsj(new Date());
                vehZnshinfo.setSqshsj(new Date());
                vehZnshinfoService.updateVehZnshinfo(vehZnshinfo);
            }
            ShDetItemConfig shDetItemConfig = null;
            //是第一次获取
            if (vehZnshinfo == null) {
                Vehicle vehicle = iq_18C22.getVehicle();
                //审核信息写入veh_znshInfo表
                if (vehicle != null) {
                    //车辆审核信息入库
                    vehZnshinfo = JSON.parseObject(JSON.toJSONString(vehicle), VehZnshinfo.class);

                    //根据审核信息和图片生成作业信息，并写入作业表
                    shDetItemConfig = shDetItemConfigService.getDetItemConfig(vehZnshinfo.getCllx(), vehZnshinfo.getSyxz(), "1"); //获取检验项配置,shlb-->0：查验；1：检验
                    if (shDetItemConfig == null) {
                        log.info("暂无该车辆类型为" + vehZnshinfo.getCllx() + ",使用性质为" + vehZnshinfo.getSyxz() + "的配置(shDetItemConfig),【车牌号】" + vehZnshinfo.getHphm());
                        //todo 执行将该流水的所有照片审核状态设置为3,无需审核
                        xbjcMapper.updateZpshbj(jylsh,"3");
                        xbjcMapper.updateVehFlowYshbj(jylsh,"3");
                        return;
                    }

                    //初始化审核状态，创建时间，审核类别，操作状态
                    vehZnshinfo.setShzt("0");
                    vehZnshinfo.setCjsj(new Date());
                    vehZnshinfo.setShlb("1");//1,检验；2,预审核
                    vehZnshinfo.setCzzt("0");//默认值，未检验
                    vehZnshinfo.setYczt("0");//默认值，设为正常
                    vehZnshinfo.setSqshsj(new Date());//申请审核时间
                    vehZnshinfo.setJyjgbh(jyjgbh);//检验机构编号

                    //添加车辆信息到veh_znshinfo表
                    vehZnshinfo.setPzclfl(shDetItemConfig.getClfl());
                    vehZnshinfo.setPzcllx(shDetItemConfig.getCllx());
                    vehZnshinfo.setPzsyxz(shDetItemConfig.getSyxz());
                    vehZnshinfo.setPzzpzl(shDetItemConfig.getZpzl());
                    vehZnshinfo.setPzpzx(shDetItemConfig.getPzx());
                    vehZnshinfo.setJyw(MD5Encryption.encryption(vehZnshinfo.toString())); //写入校验位
                    vehZnshinfoService.AddVehZnshinfo(vehZnshinfo);
                    log.info(vehZnshinfo.getHphm() + "-->入表VehZnshinfo成功！");
                }
            }

            List<VehZnshzlzpxx> list = new ArrayList<>();
            //获取该条流水的照片信息
            List<VehPhotodesDto> photodes = xbjcMapper.getPhotoInfoList(jylsh);
            //审核照片入库
            if (photodes != null && photodes.size() > 0) {
                for (int i = 0; i < photodes.size(); i++) {
                    VehZnshzlzpxx vehZnshzlzpxx = JSON.parseObject(JSON.toJSONString(photodes.get(i)), VehZnshzlzpxx.class);
                    vehZnshzlzpxx.setLsh(jylsh);
                    vehZnshzlzpxx.setShzt("0");
                    vehZnshzlzpxx.setZpurl(jylsh+"_"+vehZnshzlzpxx.getZpzl()+".jpg");
                    vehZnshzlzpxxService.AddVehZnshzlzpxx(vehZnshzlzpxx);
                    list.add(vehZnshzlzpxx);
                }
                if (list.size()>0)
                    log.info(vehZnshinfo.getHphm() + "-->添加照片信息成功！照片数量："+list.size());
            } else {
                log.info("车牌号【" + vehZnshinfo.getHphm() + "】无照片返回!!");
                xbjcMapper.updateVehFlowYshbj(jylsh,"3");
                return;
            }

            //根据审核信息和图片生成作业信息，并写入作业表
            createQueue(vehZnshinfo,shDetItemConfig,list);
            // 结束时间
            long etime = System.currentTimeMillis();
            log.info("【" + vehZnshinfo.getHphm() + "】入库完成耗时:" + (etime - stime) + "毫秒");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("【根据单条流水号查询新版检测系统信息异常】",e);
        }
    }

    /**
     * 产生作业信息(并写入作业表)
     * @param vehZnshinfo
     */
    private void createQueue(VehZnshinfo vehZnshinfo,ShDetItemConfig shDetItemConfig,List<VehZnshzlzpxx> list){
        List<String> thistime_zpzl = new ArrayList<>();
        if (list.size()>0){
            thistime_zpzl = list.stream().map(VehZnshzlzpxx::getZpzl).collect(Collectors.toList());
        }
        //获取配置项
        List<String> pzxList = Arrays.asList(shDetItemConfig.getPzx().split(","));
        //去集合中可能出现的空字符
        pzxList = pzxList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        //获取该流水号下所有shzt=0的图片信息
        List<VehZnshzlzpxx> zpList = vehZnshzlzpxxService.GetVehZnshzlzpxxListWithNotReviewed(vehZnshinfo.getLsh());

        //查询sh_detitemconfig检验车辆类型、使用性质、照片种类、检测项是否符合
        int shzt0 = 0;//计算shzt=0的图片数量
        for (int i = 0; i < zpList.size(); i++) {
            String zpzl = zpList.get(i).getZpzl();
            //如果该照片种类无需审核，直接进入下一循环
            if (!shDetItemConfig.getZpzl().contains(zpzl)){
                if (thistime_zpzl.contains(zpzl))//在本次查询的照片列表中
                    shzt0++;
                if (shzt0 == list.size()){
                    //todo 此处是同步调用18C92向检验监管系统上报照片检验结果
                    log.info("【第二次获取照片且都不审核情况】"+vehZnshinfo.getLsh());
                }
                //防止在删除某个zpzl的审核时，后面18C92上传不了的问题，需要将之前已经写进去的Jyx清空
                zpList.get(i).setJyx("");
                vehZnshzlzpxxService.UpdateZnshzlzpxx(zpList.get(i));
                xbjcMapper.updateZpshbjByZpzl(vehZnshinfo.getJylsh(), "3",zpzl);//无需审核
                continue;
            }

            //根据zpzl在sh_itemconfig查询需要检测的所有配置项
            List<String> shxList = shItemConfigService.getShxdmList(zpzl);

            //与pzx做交集，结果为该照片只需检验的项
            String jyx = StringUtils.join(CollectionUtils.intersection(pzxList, shxList).toArray(), ",");
            //找到配置项后将信息写入队列对象存入数据库
            VehQueuexxb vehQueuexxb = new VehQueuexxb();
            vehQueuexxb.setZt("0");
            vehQueuexxb.setLsh(zpList.get(i).getLsh());
            vehQueuexxb.setCjsj(new Date());
            vehQueuexxb.setZpzl(zpzl);
            vehQueuexxb.setJyx(jyx);
            vehQueuexxbService.addVehQueuexxb(vehQueuexxb);
            //将检验项写入VehZnshzlzpxx表
            zpList.get(i).setJyx(jyx);
            vehZnshzlzpxxService.UpdateZnshzlzpxx(zpList.get(i));
        }
        xbjcMapper.updateVehFlowYshbj(vehZnshinfo.getLsh(), "4");//需要审核
    }
}
